Public Class LCGRandom
'[Inherits BaseRandom]
Protected Const A As Decimal = 214013
Protected Const C As Decimal = 2531011
Protected Const M As Decimal = 2 ^ 32
Protected seed As Decimal
''' <summary>
''' Crea una nuova istanza di LCGRandom
''' </summary>
Public Sub New()
'crea il seed
seed = Lowest64Bit(Now.Ticks + Now.ToBinary + Now.TimeOfDay.TotalMilliseconds + Now.TimeOfDay.TotalSeconds)
End Sub
''' <summary>
''' Crea una nuova istanza di LCGRandom
''' </summary>
Public Sub New(seed As ULong)
'imposta il seed
Me.seed = seed
End Sub
''' <summary>
''' Scarta un numero pseudo-casuale
''' </summary>
Public Overrides Sub [Next]()
'ricalcola il seed
seed = Lowest64Bit((seed * A + C) Mod M)
End Sub
''' <summary>
''' Genera un byte pseudo-casuale
''' </summary>
''' <remarks>Il numero pseudo-casuale generato è compreso tra 0 e 255</remarks>
''' <returns>Un byte pseudo-casuale</returns>
Public Overrides Function NextByte() As Byte
'imposta nextByte
NextByte = seed Mod 256
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un numero double pseudo-casuale
''' </summary>
''' <remarks>Il numero pseudo-casuale generato ha un valore compreso tra 0.0 e 1.0</remarks>
''' <returns>Un numero double pseudo-casuale</returns>
Public Overrides Function NextDouble() As Double
'imposta nextDouble
NextDouble = seed / M
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un numero intero pseudo-casuale
''' </summary>
''' <remarks>Il numero generato è compreso tra <see cref="Int32.MinValue">Integer.MinValue</see> e <see cref="Int32.MaxValue">Integer.MaxValue</see></remarks>
''' <returns>Un numero intero</returns>
Public Overloads Overrides Function NextInt() As Integer
'calcola nextint
NextInt = seed Mod (UInteger.MaxValue + 1) + Integer.MinValue
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un numero intero pseudo-casuale
''' </summary>
''' <remarks>
''' Il numero generato ha un valore compreso tra
''' 0 e <paramref name="maxValue">maxValue</paramref>
''' </remarks>
''' <param name="maxValue">Massimo valore che il RNG può generare</param>
''' <returns>Un numero intero</returns>
Public Overloads Overrides Function NextInt(maxValue As Integer) As Integer
'calcola nextint
NextInt = seed Mod (maxValue + 1)
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un numero intero pseudo-casuale
''' </summary>
''' <remarks>Il numero intero generato ha un valore compreso tra <paramref name="minValue">minValue</paramref> e <paramref name="maxValue">maxValue</paramref></remarks>
''' <param name="minValue">Il numero più piccolo che il RNG può generare</param>
''' <param name="maxValue">Il numero più grande che il RNG può generare.</param>
''' <returns>Un numero intero pseudo-casuale</returns>
Public Overloads Overrides Function NextInt(minValue As Integer, maxValue As Integer) As Integer
'calcola nextint
NextInt = (seed Mod (maxValue - minValue + 1)) + minValue
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un numero intero pseudo-casuale
''' </summary>
''' <remarks>Il numero intero generato ha un valore compreso nel <paramref name="rng">range</paramref></remarks>
''' <param name="rng">Range in cui è compreso il numero</param>
''' <returns>Un numero intero pseudo-casuale</returns>
Public Overloads Overrides Function NextInt(rng As Range) As Integer
'calcola nextint
NextInt = seed Mod (rng.Max + 1) + rng.Min
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un SByte pseudo-casuale
''' </summary>
''' <remarks>Il numero generato è compreso tra -127 e 128</remarks>
''' <returns>Un SByte pseudo-casuale</returns>
Public Overrides Function NextSByte() As SByte
'calcola nextint
NextSByte = seed Mod (Byte.MaxValue + 1) + SByte.MinValue
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un numero single pseudo-casuale
''' </summary>
''' <remarks>Il numero single generato è compreso tra 0.0 e 1.0</remarks>
''' <returns>Un numero single pseudo-casuale</returns>
Public Overrides Function NextSingle() As Single
'calcola nextint
NextSingle = seed / M
'scarta un numero
[Next]()
End Function
''' <summary>
''' Genera un numero intero pseudo-casuale
''' </summary>
''' <remarks>Il numero intero ha un valore compreso tra 0 e <see cref="UInt32.MaxValue">UInt32.MaxValue</see></remarks>
''' <returns>Un numero intero pseudo-casuale</returns>
Public Overrides Function NextUInt() As UInteger
'calcola nextint
NextUInt = seed Mod (UInteger.MaxValue + 1)
'scarta un numero
[Next]()
End Function
''' <summary>
''' Restituisce il numero decimale solo con i lowest-64bit
''' </summary>
''' <param name="num">Numero</param>
''' <returns>Il numero decimale solo con i lowest-64bit</returns>
Protected Shared Function Lowest64Bit(ByVal num As Decimal) As Decimal
'calcola gli interi del numero
Dim bits() As Integer = Decimal.GetBits(num)
'restituisce il nuovo decimale
Return New Decimal(bits(0), bits(1), 0, False, 0)
End Function
End Class